package com.shujia.scala

import scala.io.Source

object Demo28Match {
  def main(args: Array[String]): Unit = {

    /**
      * java 中的模式匹配
      * 可以匹配基本数据类型，字符串，枚举
      *
      * scala中的模式匹配可以匹配基本数据类型，字符串，枚举，对象，匹配类型
      *
      */

    //1、匹配基本数据类型
    val i = 300

    i match {
      //匹配项，只有一个可以匹配成功
      case 100 => println("i等于100")
      case 200 => println("i等于200")
      case _ => println("其它")
    }

    //2、匹配字符串
    val s = "java"

    s match {
      case "java" => println("s等于java")
      case "hadoop" => println("s等于hadoop")
      case _ => println("其它")
    }

    //3、匹配对象
    case class User(id: String, name: String)

    val user = User("001", "张三")

    user match {
      case User("001", "张三") => println("张三")
      case User("002", "李四") => println("李四")
      case _ => println("其它")
    }


    //4、匹配类型
    val obj: Any = List("java", "hadoop")

    obj match {
      //s 代表匹配成功之后的变量，相当于是对匹配成功的对象的引用
      case s: String => println(s"obj是一个字符串:$s")
      case i: Int => println(s"obj是一个Int类型:$i")
      case list: List[String] => println(s"obj是一个集合:$list")
      case _ => println("其它类型")
    }

    /**
      * 匹配成功止呕可以有返回值
      *
      */

    val j = 101

    val str: String = j % 2 match {
      case 1 => "奇数"
      case 0 => "偶数"
    }
    println(str)


    /**
      * 模式匹配的应用
      *
      */

    val list: List[(String, String, Int)] = List(("001", "张三", 23), ("002", "李四", 24), ("003", "王五", 25))

    //将每个人的年龄加一
    list.map((kv: (String, String, Int)) => {
      val id: String = kv._1
      val name: String = kv._2
      val age: Int = kv._3
      (id, name, age + 1)
    })


    //使用模式匹配
    list
      .map {
        //匹配类型，字段的顺序和类型要一致
        case (id: String, name: String, age: Int) =>
          (id, name, age + 1)
      }
      .foreach(println)


    /**
      *
      * 2、统计学生的总分
      */

    //读取分数表
    val scores: List[String] = Source.fromFile("data/score.txt").getLines().toList

    //取出学号和分数
    val kvScore: List[(String, Int)] = scores.map(score => {
      val split: Array[String] = score.split(",")
      //学号
      val id: String = split(0)
      //分数
      val sco: Int = split(2).toInt
      (id, sco)
    })

    //按照学号分组
    val groupByScore: Map[String, List[(String, Int)]] = kvScore.groupBy(kv => kv._1)


    groupByScore
      .map {
        case (id: String, scos: List[(String, Int)]) =>
          //取出分数
          val scoress: List[Int] = scos.map {
            case (i: String, sco: Int) => sco
          }
          //计算总分
          val sumSco: Int = scoress.sum

          (id, sumSco)

      }
      .foreach(println)


    /**
      * 匹配数组
      *
      */

    scores
      .map(line => line.split(","))
      .map {
        //匹配数组，需要按照顺序写，需要明确类型
        //没有使用的列可以使用下划线占位
        case Array(id: String, _: String, sco: String) =>
          (id, sco.toInt)
      }
      .foreach(println)


  }

}
